#ifndef _BO2_6_H
#define _BO2_6_H
//bo2-6.h是设立尾指针的单循环链表的12个基本操作，存储结构由c2-2.h定义
#include "c1.h"
#include "c2-2.h"

void InitList(LinkList &L)
{
    L = (LinkList)malloc(sizeof(LNode));
    if(!L)
        exit(OVERFLOW);
    L->next = L;
}

void ClearList(LinkList &L)
{
    LinkList p, q;
    L = L->next; //L指向头结点
    p = L->next; //p指向第一个节点
    while(p!=L)
    {
        q = p->next;
        free(p);
        p = q;
    }
    L->next = L;//头结点的指针域指向头结点
}

void DestroyList(LinkList &L)
{
    ClearList(L);
    free(L);
    L = NULL; //L不指向任何地址（存储单元）
}

Status ListEmpty(LinkList L)
{
    if(L->next == L)
        return TRUE;
    else
        return FALSE;
}

int ListLength(LinkList L)
{
    int i = 0;
    LinkList p = L->next; //p（指向） 头结点
    while(p != L) // 未到表尾
    {
        i++;
        p = p->next;
    }
    return i;
}

Status GetElem(LinkList L, int i, ElemType &e)
{
    int j = 1; // 设置计数器初值为1
    LinkList p = L->next->next; // p 第一个节点
    if( i <= 0 || i>ListLength(L))
        return ERROR;
    while(j < i)
    {
        j++;
        p = p->next;
    }
    e = p->data;
    return OK;
}

int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType))
{
    int i = 0;
    LinkList p = L->next->next; // p 第一个节点
    while(p != L->next) //未到表尾
    {
        i++;
        if(compare(p->data, e))
            return i;
        p = p->next;
    }
    return 0;
}

Status PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e)
{
    LinkList q, p = L->next->next;
    q = p->next;
    while(q != L->next)//未到表尾
    {
        if(q->data == cur_e)
        {
            pre_e = p->data;
            return OK;
        }
        p = q;
        q = q->next;

    }
    return ERROR;
}

Status NextElem(LinkList L, ElemType cur_e, ElemType &next_e)
{
    LinkList p = L->next->next;
    while(p != L)
    {
        if(p->data == cur_e)
        {
            next_e = p->next->data;
            return OK;
        }
        p = p->next;
    }
    return ERROR;
}

Status ListInsert(LinkList &L, int i, ElemType e)
{
    LinkList p = L->next , s;
    int j = 0;
    if(i < 0 || i > ListLength(L)+1)
        return ERROR;
    while(j < i -1)
    {
        j++;
        p = p->next;
    }
    s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    if(p == L)
        L = s;
    return OK;
}

Status ListDelete(LinkList &L, int i, ElemType &e)
{
    LinkList q, p = L->next;
    int j =0;
    if( i <= 0 || i>ListLength(L))
        return ERROR;
    while(j < i -1)
    {
        j++;
        p = p->next;
    }
    q = p->next;
    p->next = q->next;
    e = q->data;
    if(L == q)
        L = p;
    free(q);
    return OK;
}

void ListTraverse(LinkList L, void(*vi)(ElemType))
{
    LinkList p = L->next->next;
    while(p != L->next)
    {
        vi(p->data);
        p = p->next;
    }
    printf("\n");
}

#endif